---
title: 守护态运行
sidebar_position: 3
---

在实际使用中, 大多数情况下我们的容器都是在后台运行的, 需要我们一直在前台一直盯着的情况就很少, 因此我们可以使用 `-d` 参数让容器以守护态运行在后台, 不会占用前台的窗口

```bash
docker run -d -p 8080:80 --name aname nginx:alpine
```

运行以上命令之后并不会像以前一样直接在终端窗口中输出 nginx 的运行日志, 而是会在后台运行, 然后打印一次容器的ID

```bash
docker ps -a
```

```bash
CONTAINER ID   IMAGE                       COMMAND                   CREATED              STATUS                      PORTS                    NAMES
5497f286c29d   nginx:alpine                "/docker-entrypoint.…"   About a minute ago   Up About a minute           0.0.0.0:8080->80/tcp     aname
```

## 查看容器的运行日志

当容器运行在后台时, 我们就看不到运行日志了, 对于开发来说这是万万不行的, 分析日志可以帮助开发者快速定位问题, 因此我们可以使用 `docker logs` 命令来查看容器的运行日志

```bash
docker logs aname
```

```bash
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2024/11/18 12:25:32 [notice] 1#1: using the "epoll" event method
2024/11/18 12:25:32 [notice] 1#1: nginx/1.27.2
2024/11/18 12:25:32 [notice] 1#1: built by gcc 13.2.1 20240309 (Alpine 13.2.1_git20240309) 
2024/11/18 12:25:32 [notice] 1#1: OS: Linux 5.15.167.4-microsoft-standard-WSL2
2024/11/18 12:25:32 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2024/11/18 12:25:32 [notice] 1#1: start worker processes
2024/11/18 12:25:32 [notice] 1#1: start worker process 30
2024/11/18 12:25:32 [notice] 1#1: start worker process 31
172.17.0.1 - - [18/Nov/2024:12:25:44 +0000] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0" "-"
```

运行之后就能直接看到运行日志了

### 跟随日志

以上的方式并不适合查看实时日志, 程序一直在运行, 日志也在不断生成, 我们不可能每次都输出全量的日志, 此时我们可以通过添加 `-f` 或者 `--follow` 参数来跟随日志输出

```bash
docker logs -f aname
docker logs --follow aname
```

此时终端窗口就会被占用, 一直输出日志, 直到程序停止或者我们手动退出日志的查看

### 限制输出长度

当容器运行了很长时间之后, 会产生大量日志, 如果不加限制, 每次我们查看日志时都需要从头到尾输出一边, 这很消耗时间和资源, 此时可以通过使用 `-n` 参数来限制输出的日志数量

```bash
docker logs -f -n 10 aname
```

此时只会一次性输出最近的10条日志, 再之前的日志就不会输出了

## 限制输出时间

有时我们需要排查固定时间段的日志内容, 此时使用 `--since` 和 `--until` 即可

```bash
docker logs --since '2024-11-18T12:25:20Z' --until '2024-11-18T12:25:33Z' aname
```
